package com.xsd.juc;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * @Description: 第三种获得多线程的方式
 * @Author: zhoufuzong
 * @Created: 2021-01-01 21:37:08
 * @Version: 1.1.0
 */

/*
    callable 接口与runnable 接口的区别

    1.是否有返回值
    2.是否抛异常
    3.落地方法不同，一个是run,一个是call
 */

//class MyThread implements Runnable{
//    @Override
//    public void run() {
//
//    }
//}

class MyThread implements Callable<Integer>{
    @Override
    public Integer call() throws Exception {

        System.out.println("****** come in Callable");
        try{TimeUnit.SECONDS.sleep(4); } catch(InterruptedException e) {e.printStackTrace();}
        return  1024;
    }
}
/**
 * 多线程中,第三种获得多线程的方式
 *
 * 1  get 方法一般请放在最后一行
 */
public class CallableDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask futureTask = new FutureTask(new MyThread());  // 多态思想 FutureTask 实现了Runnable接口

        new Thread(futureTask,"A").start();
        new Thread(futureTask,"B").start();  // call 方法只调一次


        System.out.println(Thread.currentThread().getName()+"\t"+"计算完成");

        System.out.println(futureTask.get());

        /*
        main	计算完成
        ****** come in here // 只调用一次，结果复用
        等待4s
            1024
         */

    }
}
